package scales.xml.dsl
import scales.xml.{
XmlTree, Elem,
XCC, XmlItem,
QName, ScalesXml,
Attribute, emptyChildren,
ItemOrElem, XPath,
XmlPath, Text, isEmptyTree
}
import scales.utils.collection.path._
import scales.utils.{AsBoolean, subtree, foldPositions, booleanMatcher, booleanAndTMatcher, top, item}
import ScalesXml.xmlCBF
import ScalesXml.fromParserDefault
object OptionalDslBuilder {
def apply( qname : QName ) = new OptionalDslBuilder(DslBuilder.elem2tree(Elem(qname)))
def apply( elem : Elem ) = new OptionalDslBuilder(DslBuilder.elem2tree(elem))
def apply( tree : XmlTree ) = new OptionalDslBuilder(tree)
}
final class OptionalDslBuilder private(val tree: XmlTree) {
import ScalesXml._
private implicit def dslToOptional(dsl: DslBuilder): OptionalDslBuilder =
new OptionalDslBuilder(dsl.toTree)
def ?/@(attribs : => Iterable[Attribute]): OptionalDslBuilder =
tree./@(attribs)
def addOptionalAttributes(attribs : => Iterable[Attribute]): OptionalDslBuilder =
tree./@(attribs)
def ?/@(attrib : Option[Attribute]): OptionalDslBuilder =
tree./@(attrib)
def addOptionalAttribute(attrib : Option[Attribute]): OptionalDslBuilder =
tree./@(attrib)
private def addNonEmptys(itemOrElems: Iterable[ItemOrElem] ): OptionalDslBuilder =
tree./(itemOrElems.filter{
_.fold(i => true, t => !isEmptyTree(t))
})
def addNonEmpty( itemOrElems: => Iterable[ItemOrElem] ): OptionalDslBuilder =
addNonEmptys(itemOrElems)
def addNonEmpty( itemOrElems: ItemOrElem * ): OptionalDslBuilder =
addNonEmptys(itemOrElems)
def ?/( itemOrElem : OptionalDslBuilder ): OptionalDslBuilder =
tree./(itemOrElem.toOptionalTree)
def addOptionalChild( itemOrElem : OptionalDslBuilder ): OptionalDslBuilder =
tree./(itemOrElem.toOptionalTree)
def addOptionalChildren( items: => Iterable[OptionalDslBuilder] ): OptionalDslBuilder =
addOptionals(items)
def addOptionalChildren( items: OptionalDslBuilder * ): OptionalDslBuilder =
addOptionals(items)
private def addOptionals( items: => Iterable[OptionalDslBuilder] ): OptionalDslBuilder =
tree.addOptionals(items.map(_.toOptionalTree))
def ?/( itemOrElem: OptionalDslBuilder *): OptionalDslBuilder =
addOptionals(itemOrElem)
def ?/( itemOrElem : => Iterable[OptionalDslBuilder] ): OptionalDslBuilder =
addOptionals(itemOrElem)
def ?~>( value : String ): OptionalDslBuilder =
tree.~>(value)
def setNonOptionalValue( value : String ): OptionalDslBuilder = ?~>(value)
def ?~>( value : Option[String] ): OptionalDslBuilder =
tree.~>(value)
def setOptionalValue( value : Option[String] ): OptionalDslBuilder = ?~>(value)
def toOptionalTree: Option[XmlTree] =
if (isEmptyTree(tree))
None
else
Some(tree)
}